package com.lamou3g.code0509;

import javax.servlet.Servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * Created by dllo on 18/5/9.
 */
//实现servlet的第三种方式:继承HttpServlet,覆写里面的doGet方法
    //HttpServlet(最常用)封装了和http协议(应用层协议,里面有状态码)相关的东西,方法已经封装好,只需要覆写doGet方法
    //状态码:404,页面未找到;405,服务器正确的理解你的响应,但是拒绝了你
    //5... 服务器端出错
    //4... 客户端出错
    //3... 重定向(页面没有你要的东西,去别的页面找)
    //2... 成功
    //http协议规定9种操作,用来满足特定条件
    //(默认的请求)get请求:用来从服务器获取数据的请求(浏览器输入网址的)
public class MyServlet extends HttpServlet {
    /*
    req:是浏览器发来的请求,请求的所有数据都在这里面
    resp:是要返回的数据,叫做响应,向resp操作,就可以将处理后的结果,返回给调用方
     */
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        /*HttpServletRequest解释:
        公共接口类HttpServletRequest继承自ServletRequest。客户端浏览器发出的请求被封装成为
        一个HttpServletRequest对象。对象包含了所有的信息包括请求的地址，请求的参数，提交的数据，
        上传的文件客户端的ip甚至客户端操作系统都包含在其内。HttpServletResponse继承了ServletResponse接口，
        并提供了与Http协议有关的方法，这些方法的主要功能是设置HTTP状态码和管理Cookie。
         */
/*HttpServletResponse解释:
网上解释:
HttpServletResponse继承了ServletResponse,Web服务器收到客户端的http请求，会针对每一次请求，分别创建一个用于代
表请求的request对象和代表响应的response对象,request和response对象即然代表请求和响应，那我们要获取客户机提交过来
的数据，只需要找request对象就行了。要向客户机输出数据，只需要找response对象就行了。
 */
/*老师解释:
客户端-->Tomcat-->Servlet
服务器(Tomcat)调用Servlet时做了以下几件事:
1.创建request对象,将请求的相关参数放入request中
2.创建reponse对象
3.调用Servlet的service方法,将这两个对象传入Servlet
4.Servlet进行一系列的逻辑运算,将返回结果放入response中
 */

        //如果我们要让自己的servlet支持get请求
        //那么必须要覆写doGet并且不能调用父类的doGet方法
        //如果你就想抛个405异常,那你就调用即可

        /*
        ServletContext 是javaweb 4大域对象之一
        有时我们也叫做app/application

        特点:
        1.所有的servletContext都是同一个对象,
        即无论在哪个servlet中获取context对象,都是同一个,利用这一点,
        可以做多个servlet传值/记录整个网站的信息
        2.寿命极长:与天地同寿,tomcat启动,这个对象就被创建,
        tomcat停止,这个对象就会被销毁

        域对象:
        我们一共有4个域对象,域对象的作用就是在一个范围内
        共享值使用的(servletContext范围是最大的,大到网站中所有的使用的servletContext都是同一个)
         */



//        示例:servletContext的值是共享的
        ServletContext app = getServletContext();
        //getAttribute()拿值,setAttribute()放值,用法与hashMap一样
        Integer count = (Integer) app.getAttribute("count");
        //从域对象中拿值
        if (count == null) {
            count = 1;
        } else {
            count++;
        }
        app.setAttribute("counts", count);
        //每访问一次就存到域对象中
        PrintWriter writer = resp.getWriter();
        writer.println(count);
    }
}
